package com.cn.why.springclouduser_server.until;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 模拟单点登录，单点登录是用于方面用户登录不同的系统不用
 * 多次登录，只需一次,利用了sso原理
 */
@WebListener    //监听Session
public class SingleLogin implements HttpSessionListener {
    //以下是HttpSessionListenter中的默认方法
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

    }
    //保存sessionId和userName的映射
    private static HashMap userNameAndSession = new HashMap();

    /**
     *isAlreadyLogin是判断用户是否登录过
     * UserName是用户的用户名
     */
    public static boolean isAlreadyLogin(HttpSession session, String userName){
        //是否登录的标志
        boolean flag = false;
        //判断该用户是否登录过，如果登录过则使上次的用户掉线(判断是否在session中)
        if (userNameAndSession.containsValue(userName)){
            flag=true;//是登录的状态
            //遍历删除以前的seesionID以及对应的用户信息新建
            Iterator iter = userNameAndSession.entrySet().iterator();
            while (iter.hasNext()){
                Map.Entry entry = (Map.Entry)iter.next();
                Object key = entry.getKey();
                Object val = entry.getValue();
                if(userName.equals(val.toString())){
                    //移除session
                    userNameAndSession.remove(key);
                }
            }
            //添加新的sessionId和userName
            userNameAndSession.put(session.getId(),userName);
        }else {//没有的话直接添加sessionId和userName
            flag=false;
            userNameAndSession.put(session.getId(),userName);
        }
        return flag;
    }

    /**
     * 判断用户是否在线
     */
    public static boolean isOnline(HttpSession session){
        boolean flag = false;
        if (userNameAndSession.containsKey(session.getId())){
            flag=true;
        }else {
            flag=false;
        }
        return flag;
    }
}
